/**
 * Created by Toma on 2016/7/29.
 * call 和 apply
 *
 * http://www.jianshu.com/p/00dc4ad9b83f
 */

"use strict";

/**
 * apply call 用法
 * @param name
 * @param age
 * @constructor
 */

// 定义一个人类
function Person(name, age) {
  this.name = name;
  this.age = age;
}
// 定义一个学生类
function Student(name, age, grade) {
  // Person.apply(this, arguments);
  Person.call(this, name, age);
  this.grade = grade;
}
//创建一个学生类
var student = new Student("zhangsan", 21, "一年级");
console.log("name:" + student.name + "\n" + "age:" + student.age + "\n" + "grade:" + student.grade);


// 举例获取数组中最大的一个
console.log(Math.max.apply(null, [1, 2, 5, 3]));
console.log(Math.min.apply(null, [1, 2, 5, 3]));

// 拼合数组
var arr = ["1", "2", "3"];
var arrNew = ["4", "5", "6"];
Array.prototype.push.apply(arr, arrNew);
console.log(arr);

// 一般在目标函数只需要n个参数列表,而不接收一个数组的形式（[param1[,param2[,…[,paramN]]]]）,可以通过apply的方式巧妙地解决这个问题!

// bind

function list() {
  // 将arguments转成数组
  return Array.prototype.slice.call(arguments);
}
var leadingThirtysevenList = list.bind(undefined, 37); // 绑定函数
var list = leadingThirtysevenList(1, 2, 3); // 调用绑定函数
console.log(list); // [37, 1, 2, 3]

